Skip to content

redis 五大数据类型

提示

  • redis 作为一款高性能的键值对数据库,提供了丰富的数据类型以满足不同场景需求
  • 其中最核心的五大数据类型分别是:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Sorted Set(有序集合,简称 ZSet)。

字符串类型(一)

String 是 Redis 最基础的数据类型,也是使用最广泛的类型。它是二进制安全的,可以存储任意格式的数据(如文本、数字、图片二进制等),最大容量为 512MB。

shell
# 特点
键值对结构:每个键对应一个字符串值(value 可以是字符串、数字等)。
支持原子操作:如自增、自减等,适合计数器场景。

# 常用命令
set key value     # 设置
get key           # 获取
keys *            # 列出匹配 key(仅建议本地调试;生产用 SCAN 渐进遍历,避免阻塞)
del key           # 删除 key
incr key          # 自增
decr key          # 自减
append key value  # 向字符串末尾追加
strlen key        # 获取字符长度

# 应用场景
缓存:存储热点数据(如用户信息、商品详情),减轻数据库压力。
计数器:如文章阅读量、视频播放量(用 INCR 原子更新)。
分布式锁:通过 SET key value NX EX 命令实现(NX 表示不存在才设置,避免重复加锁)。
会话存储:存储用户登录会话信息(设置过期时间自动失效)。

哈希类型(二)

Hash 类型类似于 Java 中的 HashMap,是键值对的集合(即 "键 -> 字段 -> 值" 的三级结构)。适合存储结构化数据(如对象),每个字段对应对象的一个属性。

shell
# 特点
字段和值均为字符串类型,且字段唯一(同个 Hash 中不允许重复字段)。
操作单个字段效率高,无需修改整个对象。

# 常用命令
HSET key field value    # 向 Hash 中设置字段和值
HGET key field          # 获取 Hash 中指定字段的值
HGETALL key             # 获取 Hash 中所有字段和值
HDEL key field          # 删除 Hash 中指定字段
HEXISTS key field       # 判断字段是否存在
HINCRBY key field num   # 对字段值(数字)执行增减


# 应用场景
存储对象:如用户信息(id 为键,字段为 name/age/email 等)、商品信息(id 为键,字段为 price/stock 等)。
局部更新:修改对象的某个属性(如仅更新用户的年龄),无需重新存储整个对象。

列表类型(三)

List 是有序字符串列表,允许重复元素;两端压入/弹出为 O(1),按索引访问中间元素为 O(n)。底层实现随版本演进(quicklist / listpack 等),以官方文档为准,不必死记某一种内部结构名。

shell
# 特点
有序性:元素按插入顺序排列,可通过索引访问(从 0 开始)。
双向操作:支持从头部(左侧)或尾部(右侧)插入 / 删除元素。

# 常用命令
LPUSH key value       # 向列表头部插入元素
RPUSH key value       # 向列表尾部插入元素
LPOP key              # 移除并返回列表头部元素
RPOP key              # 移除并返回列表尾部元素
LRANGE key start end  # 获取指定索引范围的元素(end 为 -1 表示最后一个)
LLEN key              # 获取列表长度


# 应用场景
消息队列:LPUSH 生产消息,RPOP 消费消息(或用 BRPOP 阻塞等待新消息)。
最新列表:如朋友圈最新动态、新闻资讯列表(用 LPUSH 新增,LRANGE 0 9 获取前 10 条)。
 / 队列实现:LPUSH + LPOP 实现栈(先进后出),LPUSH + RPOP 实现队列(先进先出)。

集合类型(四)

Set 是无序的字符串集合,不允许重复元素(重复插入会被忽略)。底层基于哈希表(或整数集合,当元素为整数且较少时)实现,因此增删查操作效率极高(O (1))。

shell
# 特点
无序性:元素无固定顺序,无法通过索引访问。
唯一性:自动去重,适合存储不重复的数据集。
支持集合运算:交集、并集、差集等。

# 常用命令
SADD key member      # 向集合添加元素
SREM key member      # 从集合移除元素
SMEMBERS key         # 返回集合所有元素
SISMEMBER key member # 判断元素是否在集合中
SINTER key1 key2     # 求两个集合的交集
SUNION key1 key2     # 求两个集合的并集
SCARD key            # 返回集合元素个数

# 应用场景
去重存储:如用户搜索历史(避免重复关键词)。
关系存储:如好友列表、关注列表(SADD 添加好友,SISMEMBER 检查是否好友)。
共同关系:如共同好友、共同标签(用 SINTER 求交集)。

有序集合类型(五)

ZSet 是 Set 的升级版本,不允许重复元素,但每个元素会关联一个分数(score,浮点数),并按分数自动排序。底层基于跳跃表 + 哈希表实现,兼顾排序和查询效率(O (log n))。

shell
# 特点
有序性:按分数升序排列(可通过命令指定降序)。
唯一性:元素唯一,但分数可重复。
分数可动态修改:通过修改分数改变元素排序。

# 常用命令
ZADD key score member              # 向有序集合添加元素(指定分数)
ZREM key member                    # 移除有序集合中的元素
ZRANGE key start end [WITHSCORES]  # 按分数升序返回指定范围元素(带 WITHSCORES 显示分数)
ZREVRANGE key start end            # 按分数降序返回指定范围元素
ZSCORE key member                  # 获取元素的分数
ZINCRBY key increment member       # 增加元素的分数
ZRANK key member                   # 返回元素的升序排名(从 0 开始)

# 应用场景
排行榜:如游戏积分排名(ZADD 存储分数,ZREVRANGE 0 9 获取前 10 名)、商品销量排名。
带权重的消息队列:按消息优先级(分数)排序,优先处理高分消息。
范围查询:如查询分数在 80-90 之间的用户(ZRANGEBYSCORE rank 80 90)。

总结

shell
String:简单键值对,适合缓存、计数器。
Hash:结构化对象,适合存储用户 / 商品信息。
List:有序列表,适合消息队列、最新列表。
Set:无序去重集合,适合关系存储、交集运算。
ZSet:有序去重集合,适合排行榜、带权重场景。